package org.joshsacks.fishies;

import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.ShortBuffer;

import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.opengles.GL10;

import android.graphics.PointF;
import android.opengl.GLSurfaceView.Renderer;
import android.util.Log;

public class TriangleRenderer implements Renderer {

	  private PointF surfaceSize;
	  private PointF offset;
	  private ByteBuffer triangleBuffer;
	 
	  public TriangleRenderer() {
	    surfaceSize = new PointF();
	    offset = new PointF();
	  }
	 
	  public void onSurfaceCreated(GL10 gl, EGLConfig config) {
	  }
	 
	  public void onSurfaceChanged(GL10 gl, int width, int height) {
	    surfaceSize.set(width, height);

	    // Create our triangle.
	    final int div = 1;
	    short[] triangles = { 
	            0, 0, 0,
	            -150, (short) 302, 0,
	            (short) (surfaceSize.x / div), (short) (surfaceSize.y / div), 0,
	    };    

	    System.err.println("x,y: " + surfaceSize.x + " " + surfaceSize.y);

	    triangleBuffer = ByteBuffer.allocateDirect(triangles.length * 2);
	    triangleBuffer.order(ByteOrder.nativeOrder());
	    for (short s : triangles) {
	      triangleBuffer.putShort(s);
	    }
	    triangleBuffer.position(0);
	    // Disable a few things we are not going to use.
	    gl.glDisable(GL10.GL_LIGHTING);
	    gl.glDisable(GL10.GL_CULL_FACE);
	    gl.glDisable(GL10.GL_DEPTH_BUFFER_BIT);
	    gl.glDisable(GL10.GL_DEPTH_TEST);
	    gl.glClearColor(.5f, .5f, .8f, 1.f);
	    gl.glShadeModel(GL10.GL_SMOOTH);
	 
	    float ratio = surfaceSize.x / surfaceSize.y;
	    gl.glViewport(0, 0, (int) surfaceSize.x, (int) surfaceSize.y);
	 
	    // Set our field of view.
	    gl.glMatrixMode(GL10.GL_PROJECTION);
	    gl.glLoadIdentity();
	    gl.glFrustumf(
	        -surfaceSize.x / 2, surfaceSize.x / 2, 
	        -surfaceSize.y / 2, surfaceSize.y / 2,
	        1, 3);
	 
	    // Position the camera at (0, 0, -2) looking down the -z axis.
	    gl.glMatrixMode(GL10.GL_MODELVIEW);
	    gl.glLoadIdentity();
	    // Points rendered to z=0 will be exactly at the frustum's 
	    // (farZ - nearZ) / 2 so the actual dimension of the triangle should be
	    // half
	    gl.glTranslatef(0, 0, -2);
	  }
	 
	  public void onDrawFrame(GL10 gl) {    
	    gl.glPushMatrix();
	 
	    gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
	    gl.glTranslatef(offset.x, offset.y, 0);
	 
	    gl.glColor4f(1.0f, 0.3f, 0.0f, .5f);    
	    gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
	    gl.glVertexPointer(3, GL10.GL_SHORT, 0, triangleBuffer);
	    gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 3);    
	    gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
	 
	    gl.glPopMatrix();
	  }
	 
	  public void move(float xDelta, float yDelta) {
	    offset.x += xDelta;
	    offset.y += yDelta;
	    Log.d("TriangleRenderer", "offset=[" + offset.x + " ," + offset.y + "]");
	  }
}
